package com.example.archive.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.archive.entity.Notice;
import com.example.archive.service.NoticeService;
import com.example.archive.util.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 企业公告管理控制器
 * 提供公告的发布、审核、查询、删除等功能
 * 支持角色权限控制：普通员工只能查看已发布公告
 * 档案管理员可以发布公告但需审核，企业领导可以直接发布和审核公告
 */
@RestController
@RequestMapping("/api/notices")
@CrossOrigin
public class NoticeController {
    
    @Autowired
    private NoticeService noticeService;
    
    /**
     * 获取已发布的公告列表（员工查看）
     * 普通员工只能查看已发布状态的公告
     * 
     * @return 统一响应格式，包含已发布的公告列表
     */
    @GetMapping("/published")
    public Result<List<Notice>> getPublishedNotices() {
        try {
            List<Notice> notices = noticeService.getPublishedNotices();
            return Result.success(notices);
        } catch (Exception e) {
            return Result.fail(500, "获取失败：" + e.getMessage());
        }
    }
    
    /**
     * 分页查询公告（管理员查看）
     * 管理员和领导可以查看所有状态的公告
     * 支持分页查询，包含发布者信息
     * 
     * @param current 当前页码，默认为1
     * @param size 每页大小，默认为10
     * @return 统一响应格式，包含分页查询结果
     */
    @GetMapping("/page")
    public Result<Page<Notice>> getNoticesPage(
            @RequestParam(defaultValue = "1") int current,
            @RequestParam(defaultValue = "10") int size) {
        try {
            Page<Notice> page = noticeService.getNoticesWithPublisher(current, size);
            return Result.success(page);
        } catch (Exception e) {
            return Result.fail(500, "获取失败：" + e.getMessage());
        }
    }
    
    /**
     * 发布公告
     * 根据用户角色决定公告状态：
     * - 企业领导：直接发布（published）
     * - 档案管理员：草稿状态（draft），需要审核
     * 
     * @param notice 公告对象
     * @return 统一响应格式，包含发布结果
     */
    @PostMapping("/publish")
    public Result<Boolean> publishNotice(@RequestBody Notice notice) {
        try {
            boolean success = noticeService.publishNotice(notice);
            if (success) {
                return Result.success(true);
            } else {
                return Result.fail(500, "发布失败");
            }
        } catch (Exception e) {
            return Result.fail(500, "发布失败：" + e.getMessage());
        }
    }
    
    /**
     * 审核公告
     * 企业领导审核档案管理员发布的公告
     * 审核通过后状态变为published，驳回后状态变为rejected
     * 
     * @param id 公告ID
     * @param status 审核后的状态（published/rejected）
     * @return 统一响应格式，包含审核结果
     */
    @PutMapping("/approve/{id}")
    public Result<Boolean> approveNotice(
            @PathVariable Integer id,
            @RequestParam String status) {
        try {
            boolean success = noticeService.approveNotice(id, status);
            if (success) {
                return Result.success(true);
            } else {
                return Result.fail(500, "审核失败");
            }
        } catch (Exception e) {
            return Result.fail(500, "审核失败：" + e.getMessage());
        }
    }
    
    /**
     * 删除公告
     * 企业领导可以删除任何公告
     * 档案管理员只能删除自己发布的草稿状态公告
     * 
     * @param id 公告ID
     * @return 统一响应格式，包含删除结果
     */
    @DeleteMapping("/{id}")
    public Result<Boolean> deleteNotice(@PathVariable Integer id) {
        try {
            boolean success = noticeService.removeById(id);
            if (success) {
                return Result.success(true);
            } else {
                return Result.fail(500, "删除失败");
            }
        } catch (Exception e) {
            return Result.fail(500, "删除失败：" + e.getMessage());
        }
    }
} 